﻿using DKPScoreWebApi.Models;
using Microsoft.EntityFrameworkCore;

namespace DKPScoreWebApi.Data
{
    /// <summary>
    /// 应用程序数据库上下文
    /// 负责与数据库的交互，定义实体集合和数据库配置
    /// </summary>
    public class AppDbContext : DbContext
    {
        /// <summary>
        /// 构造函数，接收数据库配置选项
        /// </summary>
        /// <param name="options">数据库配置选项</param>
        public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }

        /// <summary>
        /// 微信用户数据表
        /// </summary>
        public DbSet<WxUser> WxUsers { get; set; }

        /// <summary>
        /// 工会数据表
        /// </summary>
        public DbSet<Guild> Guilds { get; set; }

        /// <summary>
        /// 工会成员数据表
        /// </summary>
        public DbSet<GuildMember> GuildMembers { get; set; }

        /// <summary>
        /// 工会管理员数据表
        /// </summary>
        public DbSet<GuildAdmin> GuildAdmins { get; set; }

        /// <summary>
        /// 积分项目数据表
        /// </summary>
        public DbSet<PointItem> PointItems { get; set; }

        /// <summary>
        /// 积分记录数据表
        /// </summary>
        public DbSet<PointRecord> PointRecords { get; set; }

        /// <summary>
        /// 成员进度数据表
        /// </summary>
        public DbSet<MemberProgress> MemberProgresses { get; set; }

        /// <summary>
        /// 配置数据模型和关系
        /// </summary>
        /// <param name="modelBuilder">模型构建器</param>
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            // 微信用户表配置
            modelBuilder.Entity<WxUser>(entity =>
            {
                entity.HasIndex(u => u.OpenId).IsUnique(); // OpenId唯一索引
                entity.Property(u => u.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP"); // 默认值为当前时间
            });

            // 工会表配置
            modelBuilder.Entity<Guild>(entity =>
            {
                entity.HasIndex(g => g.CreatedBy); // 创建者索引
                entity.Property(g => g.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP");
                entity.Property(g => g.IsActive).HasDefaultValue(true); // 默认值为true
                entity.Property(g => g.GameType).HasDefaultValue("wow"); // 默认游戏类型为wow
            });

            // 工会成员表配置
            modelBuilder.Entity<GuildMember>(entity =>
            {
                entity.HasIndex(m => new { m.GuildId, m.Name }).IsUnique(); // 工会内成员名唯一
                entity.HasIndex(m => m.GuildId); // 工会ID索引
                entity.HasIndex(m => m.Name); // 成员名索引
                entity.Property(m => m.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP");
                entity.Property(m => m.IsActive).HasDefaultValue(true);
                entity.Property(m => m.CharacterLevel).HasDefaultValue(1); // 默认等级为1
            });

            // 成员进度表配置
            modelBuilder.Entity<MemberProgress>(entity =>
            {
                entity.HasIndex(mp => new { mp.MemberId, mp.ItemId }).IsUnique(); // 成员和项目组合唯一
                entity.HasIndex(mp => mp.MemberId); // 成员ID索引
                entity.Property(mp => mp.LastUpdated).HasDefaultValueSql("CURRENT_TIMESTAMP");
            });

            // 工会管理员表配置
            modelBuilder.Entity<GuildAdmin>(entity =>
            {
                entity.HasIndex(ga => new { ga.GuildId, ga.UserId }).IsUnique(); // 工会和用户组合唯一
                entity.HasIndex(ga => ga.GuildId); // 工会ID索引
                entity.HasIndex(ga => ga.UserId); // 用户ID索引
                entity.Property(ga => ga.AddedAt).HasDefaultValueSql("CURRENT_TIMESTAMP");
                entity.Property(ga => ga.Role).HasDefaultValue("admin"); // 默认角色为admin
            });

            // 积分项目表配置
            modelBuilder.Entity<PointItem>(entity =>
            {
                entity.HasIndex(pi => pi.GuildId); // 工会ID索引
                entity.HasIndex(pi => pi.PointType); // 积分类型索引
                entity.Property(pi => pi.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP");
                entity.Property(pi => pi.IsActive).HasDefaultValue(true);
            });

            // 积分记录表配置
            modelBuilder.Entity<PointRecord>(entity =>
            {
                entity.HasIndex(pr => new { pr.GuildId, pr.MemberId }); // 工会和成员组合索引
                entity.HasIndex(pr => pr.CreatedAt); // 创建时间索引
                entity.HasIndex(pr => pr.RaidDate); // 副本日期索引
                entity.Property(pr => pr.CreatedAt).HasDefaultValueSql("CURRENT_TIMESTAMP");
            });
        }
    }
}
